<?php

namespace app\common\job;

use app\common\model\Order as ModelOrder;
use app\common\model\order\Code;
use think\Db;
use think\Exception;
use think\Log;
use think\queue\Job;

class ServiceOrder
{
    public function fire(Job $job, $id)
    {
        try {
            $order = ModelOrder::get($id);
            //TODO
            //1、给用户发送消息
            $flag = $this->saoReturn($order);

            if ($flag) {
                //2、发送完成后 删除job
                $job->delete();
            } else {
                //任务轮询4次后删除
                if ($job->attempts() > 3) {
                    // 第1种处理方式：重新发布任务,该任务延迟10秒后再执行
                    //$job->release(10);
                    // 第2种处理方式：原任务的基础上1分钟执行一次并增加尝试次数
                    $job->failed();
                    // 第3种处理方式：删除任务
                    $job->delete();
                }
            }
        } catch (Exception $e) {
            // 队列执行失败
            Log::error('发送消息队列执行失败：' . json_encode($order));
        }
    }

    // 消息队列执行失败后会自动执行该方法
    public function failed($data)
    {
        Log::error('消息队列达到最大重复执行次数后失败：' . json_encode($data));
    }

    public function saoReturn($order)
    {
        $code = new Code;
        $id = $code->max('id');
        $num = 1;
        if ($id) {
            $num = intval($id++);
        }
        $len = 4;
        if (strlen((string) $num) > 4) {
            $len = strlen((string) $num);
        }
        $order_code = str_pad($num, $len, '0', STR_PAD_LEFT);
        $data['order_id'] = $order['id'];
        $data['order_code'] = $order_code;
        $code = $code->allowField(true)->save($data);
        if ($code) {
            $res = ModelOrder::where('id', $order['id'])->update(['status' => '7', 'qh_code' => $order_code]);
            return $res ? true : false;
        }
        return false;
    }
}
